home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Utilities / Text and Speech / BBEdit 2.2.2 / BBEdit Extensions / Sources / prefix.c < prev    next >
C/C++ Source or Header  |  1992-09-27  |  4KB  |  194 lines

  1. #include <SetupA4.h>
  2.  
  3. #include "ExternalInterface.h"
  4. #include "DialogUtilities.h"
  5.  
  6. /*
  7.     This external shows the use of some less trivial functionality.
  8.  
  9.     It puts up a dialog, and uses the text entered in the text field
  10.     to prefix every line, optionally in the selection.
  11. */
  12.  
  13. enum
  14. {
  15.     sel_only = 3,
  16.     
  17.     insert,
  18.     delete,
  19.     
  20.     beginning,
  21.     end,
  22.     
  23.     prefix_str
  24. };
  25.  
  26. static struct
  27. {
  28.     Boolean    insert;
  29.     Boolean    line_start;
  30.     Boolean    sel_only;
  31.     Boolean    pad;
  32.     
  33.     Str255    prefix_str;
  34. } prefix_info;
  35.  
  36. static void maintain_buttons(DialogPtr d)
  37. {
  38.     SetDlgCtl(d, insert, prefix_info.insert);
  39.     SetDlgCtl(d, delete, ! prefix_info.insert);
  40.     
  41.     SetDlgCtl(d, beginning, prefix_info.line_start);
  42.     SetDlgCtl(d, end, ! prefix_info.line_start);
  43.  
  44.     SetDlgCtl(d, sel_only, prefix_info.sel_only);
  45. }
  46.  
  47. pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
  48. {
  49.     DialogPtr d;
  50.     GrafPtr save_port;
  51.     
  52.     long sel_end, sel_start, first_char;
  53.     long start_line, end_line;
  54.     long old_start;
  55.     
  56.     short item;
  57.     
  58.     Handle text;
  59.     char *s;
  60.     
  61.     RememberA0();
  62.     SetUpA4();
  63.     
  64.     GetPort(&save_port);
  65.     
  66.     d = callbacks->CenterDialog(128);
  67.     SetPort(d);
  68.     
  69.     callbacks->GetSelection(&sel_start, &sel_end, &first_char);
  70.     
  71.     prefix_info.insert = TRUE;
  72.     prefix_info.line_start = TRUE;
  73.     BlockMove("\p> ", prefix_info.prefix_str, 3);
  74.     prefix_info.sel_only = sel_end != sel_start;
  75.     
  76.     XAbleDlgCtl(d, sel_only, prefix_info.sel_only);
  77.         
  78.     SetStrItem(d, prefix_str, prefix_info.prefix_str);
  79.     
  80.     SelIText(d, prefix_str, 0, 255);
  81.     
  82.     do {
  83.         maintain_buttons(d);
  84.         
  85.         ModalDialog(callbacks->StandardFilter, &item);
  86.         
  87.         switch (item)
  88.         {
  89.             case insert:
  90.             case delete:
  91.                 prefix_info.insert = (item == insert);
  92.                 break;
  93.                 
  94.             case beginning:
  95.             case end:
  96.                 prefix_info.line_start = (item == beginning);
  97.                 break;
  98.                 
  99.             case sel_only:
  100.                 prefix_info.sel_only = ! prefix_info.sel_only;
  101.                 break;
  102.         }
  103.     } while ((item != 1) && (item != 2));
  104.     
  105.     ReadStrItem(d, prefix_str, prefix_info.prefix_str);
  106.         
  107.     DisposDialog(d);
  108.     SetPort(save_port);
  109.     
  110.     if (item == 1) {
  111.         start_line = 0;
  112.         end_line = callbacks->GetLastLine();
  113.         
  114.         if (prefix_info.sel_only) {
  115.             start_line = callbacks->GetLineNumber(sel_start);
  116.             end_line = callbacks->GetLineNumber(sel_end);
  117.         };
  118.         
  119.         s = (char *)&prefix_info.prefix_str[0];
  120.         
  121.         if (s[0] != 0)
  122.         {
  123.             text = callbacks->GetWindowContents(w);
  124.             
  125.             callbacks->StartProgress("\pChanging Lines…", end_line - start_line, FALSE);
  126.             old_start = start_line;
  127.             
  128.             if (prefix_info.line_start)    
  129.             {
  130.                 if (prefix_info.insert)
  131.                 {
  132.                     for ( ; start_line < end_line; start_line++) {
  133.                         callbacks->DoProgress(start_line - old_start);
  134.                         
  135.                         sel_start = callbacks->GetLinePos(start_line);
  136.                         callbacks->SetSelection(sel_start, sel_start, first_char);
  137.                         callbacks->Insert((char *)&s[1], s[0]); 
  138.                     };
  139.                 }
  140.                 else
  141.                 {
  142.                     for ( ; start_line < end_line; start_line++) {
  143.                         callbacks->DoProgress(start_line - old_start);
  144.                         
  145.                         sel_start = callbacks->GetLinePos(start_line);
  146.                         
  147.                         if (callbacks->FindPattern(*text, sel_start + s[0] + 1, sel_start,
  148.                                                     &s[1], s[0], FALSE) >= 0)
  149.                         {
  150.                             callbacks->SetSelection(sel_start, sel_start + s[0], first_char);
  151.                             callbacks->Delete();
  152.                         }
  153.                     };
  154.                 }
  155.             }
  156.             else
  157.             {
  158.                 if (prefix_info.insert)
  159.                 {
  160.                     for ( ; start_line < end_line; start_line++) {
  161.                         callbacks->DoProgress(start_line - old_start);
  162.                         
  163.                         sel_start = callbacks->GetLinePos(start_line);
  164.                         sel_start = callbacks->GetLineEnd(sel_start);
  165.                         
  166.                         callbacks->SetSelection(sel_start, sel_start, first_char);
  167.                         callbacks->Insert((char *)&s[1], s[0]); 
  168.                     };
  169.                 }
  170.                 else
  171.                 {
  172.                     for ( ; start_line < end_line; start_line++) {
  173.                         callbacks->DoProgress(start_line - old_start);
  174.                         
  175.                         sel_start = callbacks->GetLinePos(start_line);
  176.                         sel_end = callbacks->GetLineEnd(sel_start);
  177.                         
  178.                         if (callbacks->FindPattern(*text, sel_end, sel_end - s[0],
  179.                                                     &s[1], s[0], FALSE))
  180.                         {
  181.                             callbacks->SetSelection(sel_end - s[0], sel_end, first_char);
  182.                             callbacks->Delete();
  183.                         }
  184.                     };
  185.                 }
  186.             }
  187.             
  188.             callbacks->DoneProgress();
  189.         }
  190.     };
  191.     
  192.     RestoreA4();
  193. }
  194.